package br.com.petsis.funcionalidades.manterVale;

import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.international.StatusMessage.Severity;

import br.com.petsis.entity.Funcionario;
import br.com.petsis.entity.Perfil;
import br.com.petsis.entity.TipoVale;
import br.com.petsis.entity.Vale;

@Name("manterValeController")
@Scope(ScopeType.CONVERSATION)
@Restrict(value="#{!identity.hasRole('"+Perfil.PERFIL_VETERINARIA+"')}")
public class ManterValeController {
	
	private static final String QRY_FUNCIONARIOS = "select f from Funcionario f where f.dtaSaida is null and f.flgAtivo = 'T'";
	private static final String QRY_VALES = "select v from Vale v where v.flgAtivo = 'T'";
	private static final String QRY_TIPOS_VALE = "select t from TipoVale t where t.flgAtivo = 'T'";
	
	@In(create=true)
	private EntityManager entityManager;
	
	private List<SelectItem> listaFuncionarios;
	
	private List<Vale> listaVales;
	
	private List<SelectItem> listaTiposVale;
	
	private Vale valeEdicao;
	
	private boolean selecionadoTodos;
	
	private Integer idFuncionario;
	
	private Integer idTipoVale;
	
	public void onLoad(){
		
	}
	
	public void onLoadList(){
		valeEdicao = new Vale();
		setIdFuncionario(null);
		setIdTipoVale(null);
		setListaTiposVale(null);
		setListaFuncionarios(null);
	}
	
	public void excluir(){
		List<Vale> listaRemocao = new ArrayList<Vale>();
		for(Vale v : getListaVales()){
			if(v.isSelecionado()){
				v.setFlgAtivo('F');
				entityManager.merge(v);
				listaRemocao.add(v);
			}
		}
		entityManager.flush();
		getListaVales().removeAll(listaRemocao);
	}
	
	public String salvar(){
		getValeEdicao().setTipoVale(null);
		getValeEdicao().setTipoVale(entityManager.find(TipoVale.class, getIdTipoVale()));
		if(getValeEdicao().getTipoVale().getFlgFuncionarioObrigatorio().equals('T')){
			if(getIdFuncionario() == null){
				FacesMessages.instance().add(Severity.ERROR,"É obrigatório informar um funcionário.");
				return null;
			}
		}
		getValeEdicao().setFlgAtivo('T');
		getValeEdicao().setFuncionario(null);
		if(getIdFuncionario() != null){
			getValeEdicao().setFuncionario(entityManager.find(Funcionario.class, getIdFuncionario()));
		}
		Vale valeSalvo = entityManager.merge(getValeEdicao());
		if(!getListaVales().contains(valeSalvo)){
			getListaVales().add(valeSalvo);
		}
		valeEdicao = new Vale();
		setIdFuncionario(null);
		setIdTipoVale(null);
		entityManager.flush();
		FacesMessages.instance().add(Severity.INFO,"Vale salvo com sucesso.");
		return "persisted";
	}
	
	public String editar(Vale vale){
		valeEdicao = vale;
		setIdFuncionario(vale.getFuncionario() != null ? vale.getFuncionario().getIdFuncionario() : null);
		setIdTipoVale(vale.getTipoVale().getIdTipoVale());
		return "editar";
	}

	public boolean isSelecionadoTodos() {
		return selecionadoTodos;
	}

	public void setSelecionadoTodos(boolean selecionadoTodos) {
		this.selecionadoTodos = selecionadoTodos;
	}
	
	public void selecionaTodos(){
		for(Vale f : getListaVales()){
			if(isSelecionadoTodos()){
				f.setSelecionado(true);
			}else{
				f.setSelecionado(false);
			}
		}
	}

	public List<SelectItem> getListaFuncionarios() {
		if (listaFuncionarios == null) {
			List<Funcionario> lista = entityManager.createQuery(QRY_FUNCIONARIOS).getResultList(); 
			listaFuncionarios = new ArrayList<SelectItem>();
			listaFuncionarios.add(new SelectItem(null,"Selecione"));
			for(Funcionario f : lista){
				listaFuncionarios.add(new SelectItem(f.getIdFuncionario(),f.getDscNome()));
			}
		}
		return listaFuncionarios;
	}

	public void setListaFuncionarios(List<SelectItem> listaFuncionarios) {
		this.listaFuncionarios = listaFuncionarios;
	}

	public Vale getValeEdicao() {
		if (valeEdicao == null) {
			valeEdicao = new Vale();
		}
		return valeEdicao;
	}

	public void setValeEdicao(Vale valeEdicao) {
		this.valeEdicao = valeEdicao;
	}

	public String novoVale(){
		return "novo"; 
	}
	
	public String cancelar(){
		valeEdicao = new Vale();
		return "voltar";  
	}

	public List<Vale> getListaVales() {
		if (listaVales == null) {
			listaVales = entityManager.createQuery(QRY_VALES).getResultList();
		}
		return listaVales;
	}

	public void setListaVales(List<Vale> listaVales) {
		this.listaVales = listaVales;
	}

	public List<SelectItem> getListaTiposVale() {
		if (listaTiposVale == null) {
			listaTiposVale = new ArrayList<SelectItem>();
			listaTiposVale.add(new SelectItem(null,"Selecione"));
			List<TipoVale> lista = entityManager.createQuery(QRY_TIPOS_VALE).getResultList();
			for(TipoVale t : lista){
				listaTiposVale.add(new SelectItem(t.getIdTipoVale(),t.getDscTipoVale()));
			}
		}
		return listaTiposVale;
	}

	public void setListaTiposVale(List<SelectItem> listaTiposVale) {
		this.listaTiposVale = listaTiposVale;
	}

	public Integer getIdFuncionario() {
		return idFuncionario;
	}

	public void setIdFuncionario(Integer idFuncionario) {
		this.idFuncionario = idFuncionario;
	}

	public Integer getIdTipoVale() {
		return idTipoVale;
	}

	public void setIdTipoVale(Integer idTipoVale) {
		this.idTipoVale = idTipoVale;
	}
	
}
